package main

import "fmt"

/**
channel通道
先进先出FIFO规则，线程安全，多Goroutine访问不需要加锁，因本身线程安全
channel是有类型，定义存放的类型不能放不同的类型，传空接口能接收所有的类型

定义/声明 Channel
如：var intChan chan int
int标示类型，可以是 map[int]String; Person; *User等
需要make之后才可使用    intChan = make(chan int,6)

进	intChan <- 1
出	t <- intChan

长度	len(intChan)
容量	cap(intChan)

只读	var intChan	<- chan int
只写	var intCHan chan <-	int

声明之后需要make开辟内存才可以使用
如果超出范围取值或插值 会报错
fatal error: all goroutines are asleep - deadlock!

*/

var intChan chan int

func main() {

	intChan = make(chan int, 10)
	intChan <- 1
	fmt.Println(intChan)
	fmt.Printf("intChan的值:%v,intChan地址:%v\n", <-intChan, &intChan)
	fmt.Printf("intChan的长度:%v,intChan容量:%v\n", len(intChan), cap(intChan))

	strChan := make(chan string, 3)
	strChan <- "本"
	strChan <- "杰"
	strChan <- "明"
	fmt.Printf("strChan的长度:%v,intChan容量:%v\n", len(strChan), cap(strChan))

	mapChan := make(chan map[int]string, 3)
	map1 := make(map[int]string, 1)
	map1[0] = "本"
	mapChan <- map1
	map2 := make(map[int]string, 2)
	map2[0] = "杰"
	map2[1] = "明"
	mapChan <- map2
	fmt.Printf("mapChan[0]:%v, mapChan[1]:%v\n", <-mapChan, <-mapChan)

}
